#include "wx/wxprec.h"
#if wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS

#include "wx/archive.h"

IMPLEMENT_ABSTRACT_CLASS( wxArchiveEntry, wxObject )
IMPLEMENT_ABSTRACT_CLASS( wxArchiveClassFactory, wxFilterClassFactoryBase )

wxArchiveInputStream::wxArchiveInputStream( wxInputStream& stream,
    wxMBConv& conv )
  : wxFilterInputStream( stream ),
    m_conv( conv ) {
}

wxArchiveInputStream::wxArchiveInputStream( wxInputStream *stream,
    wxMBConv& conv )
  : wxFilterInputStream( stream ),
    m_conv( conv ) {
}

wxArchiveOutputStream::wxArchiveOutputStream( wxOutputStream& stream,
    wxMBConv& conv )
  : wxFilterOutputStream( stream ),
    m_conv( conv ) {
}

wxArchiveOutputStream::wxArchiveOutputStream( wxOutputStream *stream,
    wxMBConv& conv )
  : wxFilterOutputStream( stream ),
    m_conv( conv ) {
}

void wxArchiveEntry::SetNotifier( wxArchiveNotifier& notifier ) {
  UnsetNotifier();
  m_notifier = &notifier;
  m_notifier->OnEntryUpdated( *this );
}

wxArchiveEntry& wxArchiveEntry::operator=( const wxArchiveEntry& e ) {
  m_notifier = NULL;
  return *this;
}

wxArchiveClassFactory *wxArchiveClassFactory::sm_first = NULL;

void wxArchiveClassFactory::Remove() {
  if( m_next != this ) {
    wxArchiveClassFactory **pp = &sm_first;
    while( *pp != this ) {
      pp = &( *pp )->m_next;
    }
    *pp = m_next;
    m_next = this;
  }
}

#endif
